package school.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;

import school.entity.ExamResult;
import school.util.DBUtil;

public class ExamDao {
	/**
	 * 增加考试成绩的同时，更新学员的最后一次考试日期
	 * 
	 * @param r
	 */
	public void add(ExamResult r) {
		String sql1 = "insert into examresult(sb_id,st_id,score,exam_date)values(?,?,?,?)";
		String sql2 = "update student set last_exam=? where stuno=?";
		Connection con = DBUtil.getConnection();
		PreparedStatement ps = null;
		PreparedStatement ps2 = null;
		// 自己考虑事务问题
		// 1:关闭自动提交特性
		// 2:根据执行结果判断是否提交还是回滚
		// 3:有异常肯定回滚
		try {
			con.setAutoCommit(false);
			ps = con.prepareStatement(sql1);
			ps.setLong(1, r.getSbId());
			// ...
			int r1 = ps.executeUpdate();

			DBUtil.close(ps);
			ps = con.prepareStatement(sql2);
			// ...ps.setDate(1, );
			int r2 = ps.executeUpdate();
			if (r1 == 1 && r2 == 1) {
				con.commit();// 提交
			} else {
				con.rollback();// 回滚
			}
		} catch (SQLException e) {
			try {
				con.rollback();
			} catch (SQLException e1) {
				// 忽略
				e1.printStackTrace();
			}
			e.printStackTrace();
		} finally {
			DBUtil.close(null, ps, con);
		}

	}

	// 一次增加多个成绩
	public void add(List<ExamResult> r) {
		String sql = "insert into examresult(sb_id,st_id,score,exam_date)values(?,?,?,?)";
		Connection con = DBUtil.getConnection();
		PreparedStatement ps = null;
		try {
			con.setAutoCommit(false);
			// 1:
			ps = con.prepareStatement(sql);
			for (ExamResult e : r) {
				ps.setLong(1, e.getSbId());
				// ....
				ps.addBatch();// 加入批处理
			}
			int[] result = ps.executeBatch();// 执行批处理

			// 2:是个思路
			// for (ExamResult e : r) {
			// ps = con.prepareStatement(sql);
			// ps.setLong(1, e.getSbId());
			// // /....
			// ps.executeUpdate();
			// ps.close();// !!!!!!
			// }
			con.commit();
		} catch (SQLException e) {
			try {
				con.rollback();
			} catch (SQLException e1) {
				// 忽略
				e1.printStackTrace();
			}
			e.printStackTrace();
		}
	}
}
